﻿/* Autor: Achim Schnell */

using System.Reflection;

namespace AppFx.Reflection.Dynamic
{
	/// <summary>
	/// FieldAccessor, der stinknormale Reflection verwendet
	/// </summary>
	public class ReflectionFieldAccessor : IDynamicFieldAccessor
	{
		#region Properties

		/// <summary>
		/// Die Informationen zur Eigenschaft, auf die zugegriffen wird
		/// </summary>
		public PropertyInfo Property { get; protected set; }

		#endregion

		#region Constructors

		/// <summary>
		/// Erstellt eine neue Instant der <see cref="ReflectionFieldAccessor"/>-Klasse.
		/// </summary>
		/// <param name="pi">Die Eigenschaftsinformationen.</param>
		public ReflectionFieldAccessor(PropertyInfo pi)
		{
			Property = pi;
		}

		#endregion

		#region Methods

		/// <summary>
		/// Liest das Property/Feld, das durch diese Instanz repräsentiert wird, vom übergeben Zielobjekt aus
		/// </summary>
		/// <param name="target">das Zielobjekt, dem das Feld/Property angehört</param>
		/// <returns>
		/// den Wert des Properties/Feldes, das durch diese Instantz repräsentiert wird
		/// </returns>
		public object Get(object target)
		{
			return Property.GetValue(target, null);
		}

		/// <summary>
		/// Ersetzt das Property/Feld, das durch diese Instanz repräsentiert wird, am übergeben Zielobjekt durch den übergeben Wert
		/// </summary>
		/// <param name="target">das Zielobjekt, dem das Feld/Property angehört</param>
		/// <param name="value">der Wert, der gesetzt werden soll</param>
		public void Set(object target, object value)
		{
			Property.SetValue(target, value, null);
		}

		#endregion
	}
}
